{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "bc7e906b",
   "metadata": {},
   "source": [
    "# Split code\n",
    "\n",
    "CodeTextSplitter를 사용하면 다양한 프로그래밍 언어로 작성된 코드를 분할할 수 있습니다.\n",
    "\n",
    "이를 위해서는 `Language` enum을 import하고, 해당하는 프로그래밍 언어를 지정해주면 됩니다.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1b107b42",
   "metadata": {},
   "source": [
    "`RecursiveCharacterTextSplitter`를 사용하여 텍스트를 분할하는 예제입니다.\n",
    "\n",
    "- `langchain_text_splitters` 모듈에서 `Language`와 `RecursiveCharacterTextSplitter` 클래스를 임포트합니다.\n",
    "- `RecursiveCharacterTextSplitter`는 텍스트를 문자 단위로 재귀적으로 분할하는 텍스트 분할기입니다.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "82b6cc84",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain_text_splitters import (\n",
    "    Language,\n",
    "    RecursiveCharacterTextSplitter,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d5484a09",
   "metadata": {},
   "source": [
    "지원되는 언어의 전체 목록을 가져옵니다.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ef956317",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 지원되는 언어의 전체 목록을 가져옵니다.\n",
    "[e.value for e in Language]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c92167b1",
   "metadata": {},
   "source": [
    "`RecursiveCharacterTextSplitter` 클래스의 `get_separators_for_language` 메서드를 사용하여 특정 언어에 사용되는 구분자(separators)를 확인할 수 있습니다.\n",
    "\n",
    "- 예시에서는 `Language.PYTHON` 열거형 값을 인자로 전달하여 Python 언어에 사용되는 구분자를 확인합니다.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d770bb42",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 주어진 언어에 대해 사용되는 구분자를 확인할 수 있습니다.\n",
    "RecursiveCharacterTextSplitter.get_separators_for_language(Language.PYTHON)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "01e92479",
   "metadata": {},
   "source": [
    "## Python\n",
    "\n",
    "`RecursiveCharacterTextSplitter` 사용한 예제는 다음과 같습니다.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cb2e6144",
   "metadata": {},
   "source": [
    "- `RecursiveCharacterTextSplitter`를 사용하여 Python 코드를 문서 단위로 분할합니다.\n",
    "  - `language` 매개변수에 `Language.PYTHON`을 지정하여 Python 언어를 사용합니다.\n",
    "  - `chunk_size`를 50으로 설정하여 각 문서의 최대 크기를 제한합니다.\n",
    "  - `chunk_overlap`을 0으로 설정하여 문서 간의 중복을 허용하지 않습니다.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "7623e0b8",
   "metadata": {},
   "outputs": [],
   "source": [
    "PYTHON_CODE = \"\"\"\n",
    "def hello_world():\n",
    "    print(\"Hello, World!\")\n",
    "\n",
    "hello_world()\n",
    "\"\"\"\n",
    "\n",
    "python_splitter = RecursiveCharacterTextSplitter.from_language(\n",
    "    language=Language.PYTHON, chunk_size=50, chunk_overlap=0\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a53788a5",
   "metadata": {},
   "source": [
    "`Document` 를 생성합니다. 생성된 `Document` 는 리스트 형태로 반환됩니다.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "bee5cf0f",
   "metadata": {},
   "outputs": [],
   "source": [
    "python_docs = python_splitter.create_documents([PYTHON_CODE])\n",
    "python_docs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "52f1a284",
   "metadata": {},
   "outputs": [],
   "source": [
    "for doc in python_docs:\n",
    "    print(doc.page_content, end=\"\\n==================\\n\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b2cba6ad",
   "metadata": {},
   "source": [
    "## JS\n",
    "\n",
    "다음은 JS 텍스트 분할기를 사용한 예시입니다\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "22df58cb",
   "metadata": {},
   "outputs": [],
   "source": [
    "JS_CODE = \"\"\"\n",
    "function helloWorld() {\n",
    "  console.log(\"Hello, World!\");\n",
    "}\n",
    "\n",
    "helloWorld();\n",
    "\"\"\"\n",
    "\n",
    "js_splitter = RecursiveCharacterTextSplitter.from_language(\n",
    "    language=Language.JS, chunk_size=60, chunk_overlap=0\n",
    ")\n",
    "\n",
    "js_docs = js_splitter.create_documents([JS_CODE])\n",
    "js_docs"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "223ef6c2",
   "metadata": {},
   "source": [
    "## TS\n",
    "\n",
    "다음은 TS 텍스트 분할기를 사용한 예시입니다.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "cc933318",
   "metadata": {},
   "outputs": [],
   "source": [
    "TS_CODE = \"\"\"\n",
    "function helloWorld(): void {\n",
    "  console.log(\"Hello, World!\");\n",
    "}\n",
    "\n",
    "helloWorld();\n",
    "\"\"\"\n",
    "\n",
    "ts_splitter = RecursiveCharacterTextSplitter.from_language(\n",
    "    language=Language.TS, chunk_size=60, chunk_overlap=0\n",
    ")\n",
    "ts_docs = ts_splitter.create_documents([TS_CODE])\n",
    "ts_docs"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9263dc1a",
   "metadata": {},
   "source": [
    "## Markdown\n",
    "\n",
    "다음은 Markdown 텍스트 분할기를 사용한 예시입니다.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5e28aca7",
   "metadata": {},
   "outputs": [],
   "source": [
    "markdown_text = \"\"\"\n",
    "# 🦜️🔗 LangChain\n",
    "\n",
    "⚡ LLM을 활용한 초스피드 애플리케이션 구축 ⚡\n",
    "\n",
    "## 빠른 설치\n",
    "\n",
    "```bash\n",
    "pip install langchain\n",
    "```\n",
    "\n",
    "# 빠르게 발전하는 분야의 오픈 소스 프로젝트 입니다. 많관부 🙏\n",
    "\"\"\""
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9517fdb2",
   "metadata": {},
   "source": [
    "분할하고 결과를 출력합니다.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f9e4d30d",
   "metadata": {},
   "outputs": [],
   "source": [
    "md_splitter = RecursiveCharacterTextSplitter.from_language(\n",
    "    # 마크다운 언어를 사용하여 텍스트 분할기 생성\n",
    "    language=Language.MARKDOWN,\n",
    "    # 청크 크기를 60으로 설정\n",
    "    chunk_size=60,\n",
    "    # 청크 간 중복되는 부분이 없도록 설정\n",
    "    chunk_overlap=0,\n",
    ")\n",
    "# 마크다운 텍스트를 분할하여 문서 생성\n",
    "md_docs = md_splitter.create_documents([markdown_text])\n",
    "# 생성된 문서 출력\n",
    "md_docs"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9ca61a16",
   "metadata": {},
   "source": [
    "## Latex\n",
    "\n",
    "LaTeX는 문서 작성을 위한 마크업 언어로, 수학 기호와 수식을 표현하는 데 널리 사용됩니다.\n",
    "\n",
    "다음은 LaTeX 텍스트의 예시입니다.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4d123be8",
   "metadata": {},
   "outputs": [],
   "source": [
    "latex_text = \"\"\"\n",
    "\\documentclass{article}\n",
    "\n",
    "\\begin{document}\n",
    "\n",
    "\\maketitle\n",
    "\n",
    "\\section{Introduction}\n",
    "% LLM은 방대한 양의 텍스트 데이터로 학습하여 사람과 유사한 언어를 생성할 수 있는 기계 학습 모델의 한 유형입니다.\n",
    "% 최근 몇 년 동안 LLM은 언어 번역, 텍스트 생성, 감성 분석 등 다양한 자연어 처리 작업에서 상당한 발전을 이루었습니다.\n",
    "\n",
    "\\subsection{History of LLMs}\n",
    "% 초기 LLM은 1980년대와 1990년대에 개발되었지만, 처리할 수 있는 데이터 양과 당시 사용 가능한 컴퓨팅 능력으로 인해 제한되었습니다.\n",
    "% 그러나 지난 10년 동안 하드웨어와 소프트웨어의 발전으로 대규모 데이터 세트에 대해 LLM을 학습시킬 수 있게 되었고, 이는 성능의 큰 향상으로 이어졌습니다.\n",
    "\n",
    "\\subsection{Applications of LLMs}\n",
    "% LLM은 챗봇, 콘텐츠 생성, 가상 어시스턴트 등 산업 분야에서 많은 응용 분야를 가지고 있습니다.\n",
    "% 또한 언어학, 심리학, 컴퓨터 언어학 연구를 위해 학계에서도 사용될 수 있습니다.\n",
    "\n",
    "\\end{document}\n",
    "\"\"\""
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cf31286c",
   "metadata": {},
   "source": [
    "분할하고 결과를 출력합니다.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f13a9425",
   "metadata": {},
   "outputs": [],
   "source": [
    "latex_splitter = RecursiveCharacterTextSplitter.from_language(\n",
    "    # 마크다운 언어를 사용하여 텍스트를 분할합니다.\n",
    "    language=Language.LATEX,\n",
    "    # 각 청크의 크기를 60자로 설정합니다.\n",
    "    chunk_size=60,\n",
    "    # 청크 간의 중복되는 문자 수를 0으로 설정합니다.\n",
    "    chunk_overlap=0,\n",
    ")\n",
    "# latex_text를 분할하여 문서 목록을 생성합니다.\n",
    "latex_docs = latex_splitter.create_documents([latex_text])\n",
    "# 생성된 문서 목록을 출력합니다.\n",
    "latex_docs"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "254ff44a",
   "metadata": {},
   "source": [
    "## HTML\n",
    "\n",
    "HTML 텍스트 분할기를 사용한 예제는 다음과 같습니다.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "56cd350a",
   "metadata": {},
   "outputs": [],
   "source": [
    "html_text = \"\"\"\n",
    "<!DOCTYPE html>\n",
    "<html>\n",
    "    <head>\n",
    "        <title>🦜️🔗 LangChain</title>\n",
    "        <style>\n",
    "            body {\n",
    "                font-family: Arial, sans-serif;  \n",
    "            }\n",
    "            h1 {\n",
    "                color: darkblue;\n",
    "            }\n",
    "        </style>\n",
    "    </head>\n",
    "    <body>\n",
    "        <div>\n",
    "            <h1>🦜️🔗 LangChain</h1>\n",
    "            <p>⚡ Building applications with LLMs through composability ⚡</p>  \n",
    "        </div>\n",
    "        <div>\n",
    "            As an open-source project in a rapidly developing field, we are extremely open to contributions.\n",
    "        </div>\n",
    "    </body>\n",
    "</html>\n",
    "\"\"\""
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c21c9459",
   "metadata": {},
   "source": [
    "분할하고 결과를 출력합니다.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5641e41a",
   "metadata": {},
   "outputs": [],
   "source": [
    "html_splitter = RecursiveCharacterTextSplitter.from_language(\n",
    "    # HTML 언어를 사용하여 텍스트 분할기 생성\n",
    "    language=Language.HTML,\n",
    "    # 청크 크기를 60으로 설정\n",
    "    chunk_size=60,\n",
    "    # 청크 간 중복되는 부분이 없도록 설정\n",
    "    chunk_overlap=0,\n",
    ")\n",
    "# 주어진 HTML 텍스트를 분할하여 문서 생성\n",
    "html_docs = html_splitter.create_documents([html_text])\n",
    "# 생성된 문서 출력\n",
    "html_docs"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b3cbf899",
   "metadata": {},
   "source": [
    "## Solidity\n",
    "\n",
    "Solidity 텍스트 분할기를 사용한 예제는 다음과 같습니다:\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b99b643c",
   "metadata": {},
   "source": [
    "- Solidity 코드를 문자열 형태로 `SOL_CODE` 변수에 저장합니다.\n",
    "- `RecursiveCharacterTextSplitter`를 사용하여 Solidity 코드를 청크 단위로 분할하는 `sol_splitter`를 생성합니다.\n",
    "  - `language` 매개변수를 `Language.SOL`로 설정하여 Solidity 언어를 지정합니다.\n",
    "  - `chunk_size`를 128로 설정하여 각 청크의 최대 크기를 지정합니다.\n",
    "  - `chunk_overlap`을 0으로 설정하여 청크 간의 중복을 없앱니다.\n",
    "- `sol_splitter.create_documents()` 메서드를 사용하여 `SOL_CODE`를 청크 단위로 분할하고, 분할된 청크를 `sol_docs` 변수에 저장합니다.\n",
    "- `sol_docs`를 출력하여 분할된 Solidity 코드 청크를 확인합니다.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3710c823",
   "metadata": {},
   "outputs": [],
   "source": [
    "SOL_CODE = \"\"\"\n",
    "pragma solidity ^0.8.20; \n",
    "contract HelloWorld {  \n",
    "   function add(uint a, uint b) pure public returns(uint) {\n",
    "       return a + b;\n",
    "   }\n",
    "}\n",
    "\"\"\"\n",
    "\n",
    "# 분할하고 결과를 출력합니다.\n",
    "sol_splitter = RecursiveCharacterTextSplitter.from_language(\n",
    "    language=Language.SOL, chunk_size=128, chunk_overlap=0\n",
    ")\n",
    "\n",
    "sol_docs = sol_splitter.create_documents([SOL_CODE])\n",
    "sol_docs"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0fa9a446",
   "metadata": {},
   "source": [
    "## C#\n",
    "\n",
    "C# 텍스트 분할기를 사용한 예제는 다음과 같습니다.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5fdeefe1",
   "metadata": {},
   "outputs": [],
   "source": [
    "C_CODE = \"\"\"\n",
    "using System;\n",
    "class Program\n",
    "{\n",
    "    static void Main()\n",
    "    {\n",
    "        Console.WriteLine(\"Enter a number (1-5):\");\n",
    "        int input = Convert.ToInt32(Console.ReadLine());\n",
    "        for (int i = 1; i <= input; i++)\n",
    "        {\n",
    "            if (i % 2 == 0)\n",
    "            {\n",
    "                Console.WriteLine($\"{i} is even.\");\n",
    "            }\n",
    "            else\n",
    "            {\n",
    "                Console.WriteLine($\"{i} is odd.\");\n",
    "            }\n",
    "        }\n",
    "        Console.WriteLine(\"Goodbye!\");\n",
    "    }\n",
    "}\n",
    "\"\"\"\n",
    "\n",
    "# 분할하고 결과를 출력합니다.\n",
    "c_splitter = RecursiveCharacterTextSplitter.from_language(\n",
    "    language=Language.CSHARP, chunk_size=128, chunk_overlap=0\n",
    ")\n",
    "c_docs = c_splitter.create_documents([C_CODE])\n",
    "c_docs"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "py-test",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
